package com.kitty.web.controller;

import com.kitty.common.schedule.task.ChongZhiRankTask;
import com.kitty.common.schedule.task.ChouJiangRankTask;
import com.kitty.common.utils.CronUtils;
import com.kitty.common.utils.SpringUtils;
import com.kitty.web.controller.BaseController;
import com.kitty.web.common.AjaxResult;
import com.kitty.web.core.page.TableDataInfo;
import com.kitty.web.domain.SpringScheduledCron;
import com.kitty.web.system.cron.service.ISpringScheduledCronService;
import com.kitty.web.system.gameServer.GameServerRefresh;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import java.util.List;


/**
 * 定时任务Controller
 * 
 * @author soul
 * @date 2022-03-13
 */
@Controller
@RequestMapping("/system/cron")
public class SpringScheduledCronController extends BaseController
{
    private String prefix = "system/cron";

    @Autowired
    private ISpringScheduledCronService springScheduledCronService;


    @GetMapping()
    public String cron()
    {
        return prefix + "/cron";
    }

    @GetMapping("/queryCron")
    public String cache2() {
        return prefix + "/cron2";
    }


    @GetMapping("/queryCache")
    public String queryCache() {
        return  "system/cache/cache2";
    }
    /**
     * 查询定时任务列表
     */

    @PostMapping("/list")
    @ResponseBody
    public TableDataInfo list(SpringScheduledCron springScheduledCron)
    {
        startPage();
        List<SpringScheduledCron> list = springScheduledCronService.selectSpringScheduledCronList(springScheduledCron);
        return getDataTable(list);
    }


    /**
     * 新增定时任务
     */
    @GetMapping("/add")
    public String add()
    {
        return prefix + "/add";
    }

    /**
     * 新增保存定时任务
     */

    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(SpringScheduledCron springScheduledCron)
    {
        return toAjax(springScheduledCronService.insertSpringScheduledCron(springScheduledCron));
    }

    /**
     * 修改定时任务
     */
    @GetMapping("/edit/{cronId}")
    public String edit(@PathVariable("cronId") Long cronId, ModelMap mmap)
    {
        SpringScheduledCron springScheduledCron = springScheduledCronService.selectSpringScheduledCronById(cronId);
        mmap.put("springScheduledCron", springScheduledCron);
        return prefix + "/edit";
    }

    /**
     * 修改定时任务
     */
    @GetMapping("/edit2/{cronId}")
    public String edit2(@PathVariable("cronId") Long cronId, ModelMap mmap)
    {
        SpringScheduledCron springScheduledCron = springScheduledCronService.selectSpringScheduledCronById(cronId);
        mmap.put("springScheduledCron", springScheduledCron);
        return prefix + "/edit2";
    }

    /**
     * 新增保存定时任务
     */

    @PostMapping("/exeTask")
    @ResponseBody
    public AjaxResult exeTask(SpringScheduledCron springScheduledCron)
    {
        //运行一次
        if(springScheduledCron.getCronId() == 20){
            SpringUtils.getBean(ChongZhiRankTask.class).execute();
        }else{
            SpringUtils.getBean(ChouJiangRankTask.class).execute();
        }

        return AjaxResult.success();
    }



    /**
     * 修改保存定时任务
     */

    @PostMapping("/edit")
    @ResponseBody
    public AjaxResult editSave(SpringScheduledCron springScheduledCron){
        // 这里处理 时间 跟 cron 转换的 问题；
        // 重写逻辑，判断 间隔时间是否未0 若为0 则表示 只需要某一个时间启动就可以了。
        //String crom = "* * * * * *";
        String s = "*";
        String m = "*";
        String h = "*";
        String d = "?";
        String mon = "*";
        String z = "*";
        /**
         * 分为两种模式， 一种是 开始时间，结束时间，间隔时间。 精确到小时， 另一种是 开始时间 结束时间 ，不需要间隔时间 精确到分钟
         */
        String startH = springScheduledCron.getCronStrat().split(":")[0];
        String startM = springScheduledCron.getCronStrat().split(":")[1];
        String endH = springScheduledCron.getCronEnd().split(":")[0];
        String endM = springScheduledCron.getCronEnd().split(":")[1];
        String newCy = "";
        //定时执行
        if("0".equals(springScheduledCron.getCronType())){
            //间隔时间
            String cronInte = springScheduledCron.getCronInte();
            //间隔单位
            String unit = springScheduledCron.getCronInteDw();
            h =startH + "-" + endH;
            if("秒".equals(unit)){
                s= "*/"+cronInte;
            }else if("分".equals(unit)){
                s = "0";
                m= "*/"+cronInte;
            }else if("时".equals(unit)){
                s = "0";
                m = "0";
                h= h+"/"+cronInte;
            }
        }else{
            //启动周期。  ---星期
            String cronCy = springScheduledCron.getCronCy();
            for (String s1 : cronCy.split(",")) {
                int i = Integer.parseInt(s1);
                i = i+1;
                if(i>7){
                    i=1;
                }
                newCy = newCy + i + ",";
            }
            if(newCy.contains(",")){
                newCy  = newCy.substring(0,newCy.length()-1);
            }
            z = cronCy;
            h=startH;
            m = startM;
            s = "0";
        }
        String crom = s +" " + m + " " + h + " " + d + " " + mon + " " + z;
        if(!CronUtils.isValid(crom)){
            return AjaxResult.error();
        }
        System.out.println(crom);
        springScheduledCron.setCronExpression(crom);
        AjaxResult ajaxResult = toAjax(springScheduledCronService.updateSpringScheduledCron(springScheduledCron));
        try {
            SpringUtils.getBean(GameServerRefresh.class).refreshCache("refreshTaskScheInfo",springScheduledCron.getCronId()+"",springScheduledCron.getStatus());
        } catch (Exception e) {
            logger.info("定时任务出错："+e);
            return AjaxResult.error();
        }
        return ajaxResult;
    }

    /**
     * 删除定时任务
     */

    @PostMapping( "/remove")
    @ResponseBody
    public AjaxResult remove(String ids)
    {
        return toAjax(springScheduledCronService.deleteSpringScheduledCronByIds(ids));
    }


    public static void main(String[] args) {
        String z = "";
        String newZ = "";
        for (String s1 : z.split(",")) {
            int i = Integer.parseInt(s1);
            i = i+1;
            if(i>7){
                i=1;
            }
            newZ = newZ+i+",";
        }
        if(newZ.contains(",")){
            newZ  = newZ.substring(0,newZ.length()-1);
        }
        System.out.println(newZ);
    }
}
